﻿using System;
using System.Collections.Generic;
using System.ComponentModel;

namespace OpenExpressApp
{
    /// <summary>
    /// 属性编辑器
    /// </summary>
    public interface IPropertyEditor : IControlWrapper, ISimplePropertyEditor
    {
        /// <summary>
        /// 属性编辑器是否可见
        /// </summary>
        bool IsVisible { get; }

        /// <summary>
        /// 这个属性是否是只读的
        /// </summary>
        bool IsReadOnly { get; }//set; }

        /// <summary>
        /// 由于PropertyInfo是变化的，
        /// 所以可以使用这个生成器在PropertyInfo变化时再次进行控件生成。
        /// </summary>
        IControlGenerator EditingControlGenerator { get; }

        /// <summary>
        /// 此生成器用于生成一个只用于显示标题的控件
        /// </summary>
        IControlGenerator LabelControlGenerator { get; }

        /// <summary>
        /// 此生成器用于生成一个只用于显示的控件
        /// </summary>
        IControlGenerator ReadOnlyControlGenerator { get; }

        /// <summary>
        /// 当前的LabelControl
        /// </summary>
        object LabelControl { get; }

        /// <summary>
        /// 当前的ReadOnlyControl
        /// </summary>
        object ReadOnlyControl { get; }

        /// <summary>
        /// 生成所有要使用的所有控件
        /// </summary>
        /// <returns></returns>
        void EnsureControlsCreated();

        /// <summary>
        /// IsReadOnly 属性计算前，需要经过这些Checker的验证才能返回true
        /// </summary>
        /// <param name="checker"></param>
        void RegisterChecker(IReadOnlyChecker checker);

        /// <summary>
        /// IsVisible 属性计算前，需要经过这些Checker的验证才能返回true
        /// </summary>
        /// <param name="checker"></param>
        void RegisterChecker(IVisibleChecker checker);
    }

    public interface IReadOnlyChecker
    {
        bool IsReadOnly(IPropertyEditor editor);
    }
    public interface IVisibleChecker
    {
        bool IsVisible(IPropertyEditor editor);
    }
}
